package chapter05_string;

import java.awt.*;
import java.time.temporal.ValueRange;

/**
 * 描述：找到被指的新类型字符
 *      新类型字符的定义如下:
 * 1.新类型字符是长度为1或者2的字符串。
 * 2.表现形式可以仅是小写字母，例如，"e"; 也可以是大写字母+小写字母,例如, "Ab";
 * 还可以是大写字母+大写字母，例如,"DC"。
 * 现在给定一一个字符串str,str一定是若干新类型字符正确组合的结果。比如"eaCCBi",
 * 由新类型字符"e"、"a"、"CC"和"Bi"拼成。 再给定-一个整数k,代表str中的位置。请返回被
 * k位置指中的新类型字符。
 * @author hl
 * @date 2021/9/23 22:36
 */
public class PointNewChar {
    public static void main(String[] args) {
        String s = "aaABCDEcBCg";
        PointNewChar main = new PointNewChar();
//        System.out.println(main.pointNewChar(s, 7));
//        System.out.println(main.pointNewChar(s, 4));
        System.out.println(main.pointNewChar(s, 10));
    }

    /**
     * 比较巧妙的方式：
     * 从指定的小标k开始往左找到第一个小写的字符i，记k-i-1为m，
     *      如果m为奇数，则返回str[k-1...k]
     *      如果m为偶数，若k为大写字符，则返回str[k, k+1]，若k为小写字母，则返回str[k]
     * @param s
     * @param k
     * @return
     */
    public String pointNewChar(String s, int k){
        if (s == null || s.length() == 0 || k >= s.length()) {
            return null;
        }
        int uNum = 0;
        for (int i = k - 1; i >= 0; i--) {
            if (!isUpper(s.charAt(i))) {
                break;
            }
            uNum++;
        }
        if ((uNum & 1) == 1) {
            return s.substring(k - 1, k + 1);
        }
        if (isUpper(s.charAt(k))) {
            return s.substring(k, k + 2);
        }
        return String.valueOf(s.charAt(k));
    }

    public boolean isUpper(char ch){
        return ch >= 'A' && ch <= 'Z';
    }
}
